import axios from 'axios'
import store from '../store/index.js'
import JSONBig from 'json-bigint'
import router from '../router/auth.js'

const instance = axios.create({
  // baseURL: 'http://ttapi.research.itcast.cn',
  baseURL: 'http://toutiao-app.itheima.net/', // 该基地址要求url去掉app
  // timeout: 1000
  // headers: { 'X-Custom-Header': 'foobar' }
  // `transformResponse` 在传递给 then/catch 前，允许修改响应数据
  transformResponse: [function (data) {
    // 对 data 进行任意转换处理
    try {
      // console.log(data)
      // 使用json-bigint处理大数问题
      return JSONBig.parse(data)
    } catch (error) {
      // console.log(error)
      return data
    }
  }]
})

// 添加请求拦截器
instance.interceptors.request.use(function (config) {
  // 更改请求地址，把/app/替换成/
  config.url = config.url.replace('/app/', '/')
  // console.log(config)
  // 在发送请求之前做些什么
  const token = store.state.tokenInfo.token
  if (token) {
    config.headers.Authorization = `Bearer ${token}`
  }
  // console.log(config)

  return config
}, function (error) {
  // 对请求错误做些什么
  return Promise.reject(error)
})

// 对401token失效的做法
// 1、添加响应拦截器
instance.interceptors.response.use(function (response) {
  // 对响应数据做点什么
  return response
}, async function (error) { // 2、在token过期时会触发响应401错误
  // console.dir(error)
  console.log(router)
  if (error.response.status === 401) { // 3、如果响应的错误状态码为401，再次触发请求携带refreshtoken请求新的token
    const refreshToken = store.state.tokenInfo.refresh_token // 4、从vuex中获取token
    console.log(refreshToken)
    if (refreshToken) { // 5、判断当前refreshToken是否有值，有则触发请求新的token值，无则跳转到登录界面
      try {
        const res = await axios({
          url: 'http://ttapi.research.itcast.cn/app/v1_0/authorizations', // 响应拦截器发送请求不经过请求拦截器
          method: 'PUT',
          headers: {
            Authorization: `Bearer ${refreshToken}`
          }
        })
        console.log(res)
        // 取回新的token，重新存储至本地
        store.commit('mSetTokenInfo', {
          refresh_token: refreshToken,
          token: res.data.data.token
        })
      } catch (err) { // 如果refreshToken过期,则会进入catch
        // 1、需要清空token
        store.commit('mSetTokenInfo', {})
        // 2、跳转到登录页面
        router.push('/login?returnURL=' + encodeURIComponent(router.currentRoute.fullPath))
        return Promise.reject(new Error('请求新的token失败'))
      }
    } else { // 如果refreshtoken没有值，代表没有登录，则调至登录界面
      // 1、需要清空token
      store.commit('mSetTokenInfo', {})
      // 2、跳转到登录页面
      router.push('/login?returnURL=' + encodeURIComponent(router.currentRoute.fullPath))
      // router.push('/login?returnURL=') // 此处引入router，可以直接使用router.push实现路由跳转
      return Promise.reject(error)
    }
  } else { return Promise.reject(error) }
})

export default instance
